home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok11
/
r.o.m.
/
m2sources
/
formelauswertung.def
< prev
next >
Wrap
Text File
|
1993-11-04
|
6KB
|
121 lines
DEFINITION MODULE Formelauswertung;
(*
Created: 30.8.87
Changed: 12.02.88/29.8.88/1.10.88 by
Stefan Salewski
Stolper Weg 3
2160 Stade West-Germany
Tel: 04141/61130
Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
This Module may be freely copied. But please
leave my name in. Thanks....Stefan
Berechnung von Formeln in Form von Strings
------------------------------------------
Dieses Modul macht es moeglich, Programme zu schreiben, die
beliebige mathematische Formeln in Form eines Strings einlesen,
die Formel ueberpruefen und dann beliebig oft berechnen. Damit
wird ein Nachteil, den Modula gegenueber Interpreter-Sprachen wie
Basic hat, aufgehoben.
Benutzung dieses Moduls:
Zuerst liest man die mathematische Formel in Form eines Strings ein,
dieser String muss von Typ Formelstring sein.
Danach muss mit AssignLong oder AssignFFP allen Variablen, die in der
Formel vorkommen, ein (vorlaeufiger) Wert zugewiesen werden.
Dann wird DefFormel mit diesem String und einer beliebigen Formelnummer
zwieschen 1 und 10 aufgerufen. Ist der String ein korrekter mathematischer
Ausdruck, wie er z.B. auch von R.o.M. verwendet wird, (z.B. 'sin(3.5*x)'
oder '34/34.55+12.34E-123*sinh(12.7-2.12)-12.34^34') so ist die Fehlernummer
gleich Null. Nun koennen die Variablen mit AssignFFP oder AssignLong
beliebig geaendert werden, und die Formel kann mit Longberechnung oder
FFPBerechnung beliebig oft berechnet werden.
Sowohl DefFormel als auch FFPBerechnung und LongBerechnung liefern
bei Fehlern Fehlernummern. Diese Fehlernummer sollten nach jeder
Berechnung abgefragt werden. Ist sie ungleich null, so kann man mit
dem Modul FormelausFText die Ursache des Fehlers in Form eines Textes
erfahren.
Die Geschwindigkeit der Berechnung ist, wie man an R.o.M. sieht, recht
hoch. FFPBerechnung braucht zur Berechnung einer Formel ungefaehr
doppelt so lange wie es dauern wuerde, die selbe Formel in compilierter
Form zu berechnen. Bei LongBerechnung wird dagegen kaun ein Unterschied
zu der compilierten Formel bemerkbar sei, da die Zeit, die fuer die
Interpretation der Formel benoetigt wird, sehr klein gegenueber der
Zeit, die LongReal-Berechnungen in Anspruch nehmen, ist.
Eine Procedure RealBerechnung existiert momentan nicht, der Grund
dafuer ist, das Bereichsueberschreitungen bei arithmetischen
Operationen zwieschen REAL-Zahlen keine definierten Resultate ergeben.
Also kann ich diese Ueberlaufe nicht sicher festelllen und daher
nicht fuer die Korrektheit des Ergebnisses garantieren.
Formeln mit verschiedener Formelnummer koennen unabhaengig voneinander
Benutzt werden. Man kann also mehrere Formeln definieren und dann
abwechselnd berechnen lassen. Formelnummer 0 nicht verwenden, sie wird
intern benutzt.
*)
FROM SYSTEM IMPORT FFP;
CONST
StrLength=255; (* so gross duerfen die zu berechnenden Ausdruecke sein *)
AnzahlFormeln=10;(* Zahl der Formeln die gleichzeitig benutzt werden *)
(* koennen, Nummer 0 nicht verwenden *)
TYPE
Formelnummer=[0..AnzahlFormeln];
Formelstring=ARRAY[0..StrLength] OF CHAR;
(* Formelnummer 0 nicht benutzen !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*)
VAR
(* Achtung: Normalerweise sollte die Definition von Variablen ueber
AssignLong und AssignFFP erfolgen. Wenn es sehr auf die Geschwindigkeit
ankommt, koennen auch vorsichtig direkt an varListLong und varListFFP
Werte zugewiesen werden.
Ok:=AssignFFP('x',23.456) entspricht varListFFP['x']:=23.456
*)
varListLong:ARRAY['A'..'z'] OF LONGREAL;
varListFFP:ARRAY['A'..'z'] OF FFP;
PROCEDURE AssignLong(c:CHAR;x:LONGREAL):BOOLEAN;
(* Weist der Variablen c den Wert x zu *)
(* c ist Buchstabe => TRUE *)
PROCEDURE AssignFFP(c:CHAR;x:FFP):BOOLEAN;
(* Weist der Variablen c den Wert x zu *)
(* c ist Buchstabe => TRUE *)
PROCEDURE ClearVar(c:CHAR);
(* Variable c gilt als undefiniert und kann nicht mehr in Formeln
benutzt werden *)
PROCEDURE GetLongValue(c:CHAR;VAR x:LONGREAL):BOOLEAN;
(* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde *)
PROCEDURE GetFFPValue(c:CHAR;VAR x:FFP):BOOLEAN;
(* TRUE wenn dem Buchstaben c bereits ein Wert zugewiesen wurde *)
PROCEDURE DefFormel(nummer:Formelnummer;VAR str:ARRAY OF CHAR;
korrekt,onlyLong:BOOLEAN):CARDINAL;
(* Definiert eine neue Formel.Ist korrekt=TRUE, so ist 4+3*8= 28 sonst 56 *)
(*str wird nicht veraendert,bei Fehler bleibt die alte Formel unveraendert*)
(*Ist onlyLong=TRUE, so koennen in der Formel auch Zahlen > 1.0E18 vor- *)
(*kommen, dann darf aber nicht FFPBerechnung benutzt werden *)
(* Fehlernummern: *)
(* 0:Kein Fehler *)
(* 31:Formel ist leer *)
(* 32:nicht alle Variablen sind initialisiert(mit Assign...) *)
(* 33:Syntaxfehler *)
(* 34:Formel enthaelt ungueltiges Zeichen *)
(* 35:Formel enthaelt zu grosse Zahlen *)
PROCEDURE FFPBerechnung(nummer:Formelnummer;VAR ergebnis:FFP;
VAR fehlernummer:CARDINAL);
PROCEDURE LongBerechnung(nummer:Formelnummer;VAR ergebnis:LONGREAL;
VAR fehlernummer:CARDINAL);
(* Kein Fehler bei Berechnung => Fehlernummer=0 *)
END Formelauswertung.def